package com.example.apen.usdkdemo;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.allinpay.usdk.core.data.BaseData;
import com.allinpay.usdk.core.data.Busi_Data;
import com.allinpay.usdk.core.data.RequestData;
import com.allinpay.usdk.core.data.ResponseData;
import com.allinpay.usdk.dev.aidl.DeviceProvider;
import com.allinpay.usdk.dev.aidl.EthernetProvider;

import static com.example.apen.usdkdemo.Constans.CANCLE_USDK_REQUEST_CARD;
import static com.example.apen.usdkdemo.Constans.CANCLE_USDK_REQUEST_CODE;
import static com.example.apen.usdkdemo.Constans.PRINT_CUSTOM_TEXT;
import static com.example.apen.usdkdemo.Constans.QUERY_BALANCE_USDK_REQUEST;
import static com.example.apen.usdkdemo.Constans.SEND_USDK_REQUEST_CARD;
import static com.example.apen.usdkdemo.Constans.SEND_USDK_REQUEST_CODE;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn, btn2, btn3, btn4, btn5, btn6;
    private EditText et_code, et_card;
    private String etCard;
    private String etCode;
    private String string;
    private DeviceProvider mDeviceProvider;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initAIDL();

        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

        string = BitmapAndStringUtils.convertIconToString(bitmap);

        btn = (Button) findViewById(R.id.btn);
        btn2 = (Button) findViewById(R.id.btn2);
        btn3 = (Button) findViewById(R.id.btn3);
        btn4 = (Button) findViewById(R.id.btn4);
        btn5 = (Button) findViewById(R.id.btn5);
        btn6 = (Button) findViewById(R.id.btn6);
        et_card = (EditText) findViewById(R.id.et_card);
        et_code = (EditText) findViewById(R.id.et_code);

        btn.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);

        findViewById(R.id.btn7).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { // de一下
                try {
//                    打印功能
//                    PrinterProvider mPrinterProvider = mDeviceProvider.getPrinterProvider();
//                    Log.i(TAG, "onClick: "+mPrinterProvider.getStatus());
//                    mPrinterProvider.initial();
//                    mPrinterProvider.appendStr("开始吧，打印",12,false);

//                    以太网
                    EthernetProvider mEthernetProvider = mDeviceProvider.getEthernetProvider();
                    Log.i(TAG, "onClick: " + mEthernetProvider.isReady());

                } catch (RemoteException e) {
                    e.printStackTrace();
                    Log.i(TAG, "onClick: 远程服务报错 " + e.getMessage());
                }

            }
        });

    }


    private void initAIDL() {
        Intent intent = new Intent();
        intent.setAction("com.allinpay.usdk.dev.AIDL_SERVICE");//你定义的service的action
        Intent mIntent = new Intent(AppUtils.getExplicitIntent(this, intent));
        bindService(mIntent, conn, Context.BIND_AUTO_CREATE);
    }//要不要试试新开一个服务 直接调那个AIDL

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mDeviceProvider = DeviceProvider.Stub.asInterface(service);

            try {
                mDeviceProvider.getBasicProvider().initial();
            } catch (RemoteException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };


    private static final String TAG = "tag";

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn:
                goCodePay();
                break;
            case R.id.btn2:
                goCardPay();
                break;
            case R.id.btn3:
                cancleCodePay();
                break;
            case R.id.btn4:
                cancleCardPay();
                break;
            case R.id.btn5:
                queryBalance();
                break;
            case R.id.btn6:
                printText();
                break;
            default:
                break;
        }
    }

//    打印自定义文字
//参数名称	必填	注释
//    BUSINESS_ID	必填	业务类型
//    PRINT_APPEND_TEXT	必填	需要打印的文字
//    PRINT_APPEND_PIC	必填	需要打印的图片（Bitmap格式，转换为BCD格式的byte字符串）
//    PRINT_APPEND_PAGE	必填	需要打印的联数

    private void printText() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.allinpay.usdk", "com.allinpay.usdk.MainActivity"));

        Bundle bundle = new Bundle();
        RequestData data = new RequestData();

        data.putValue(RequestData.BUSINESS_ID, "900300003");//
        data.putValue(RequestData.PRINT_APPEND_TEXT, " 蒋公子 /n  你是不是傻 /n  是不是 /n  是不是 /n  到底是不是");// 跟这个咩关系  这是直接调支付的你让我看下错误吧么么哒，错呢
        data.putValue(RequestData.PRINT_APPEND_PIC, string);//
        data.putValue(RequestData.PRINT_APPEND_PAGE, "1");//

        bundle.putSerializable(RequestData.KEY_ERTRAS, data);//传递数据
        intent.putExtras(bundle);
        startActivityForResult(intent, PRINT_CUSTOM_TEXT);
    }

    private void printTextCallBack(Bundle extras, int resultCode) {
        ResponseData respone = (ResponseData) extras.getSerializable(ResponseData.KEY_ERTRAS);
//             BaseData. REJCODE_CN	String	返回码解释
        Log.d(TAG, "打印自定义文字 交易结果：" + respone.getValue(BaseData.REJCODE_CN));
//             BaseData. REJCODE	String	返回码
        Log.d(TAG, "打印自定义文字 交易成功返回 00：" + respone.getValue(BaseData.REJCODE));//交易成功 == "00"
    }


    //     查询余额， 仅银行卡可用
    private void queryBalance() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.allinpay.usdk", "com.allinpay.usdk.MainActivity"));

        Bundle bundle = new Bundle();
        RequestData data = new RequestData();
        data.putValue(RequestData.BUSINESS_ID, Busi_Data.BUSI_BALANCE_BANK);//查询余额
        bundle.putSerializable(RequestData.KEY_ERTRAS, data);//传递数据
        intent.putExtras(bundle);
        startActivityForResult(intent, QUERY_BALANCE_USDK_REQUEST);
    }

    //    撤销银行卡支付 当天的订单
    private void cancleCardPay() {

        etCard = et_card.getText().toString().trim();

        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.allinpay.usdk", "com.allinpay.usdk.MainActivity"));

        Bundle bundle = new Bundle();
        RequestData data = new RequestData();
//        data.putValue(RequestData.OPER_NO, "001 操作员号");//操作员号
        data.putValue(RequestData.AMOUNT, "000000000001");//支付金额 金额（12位，分为单位，不足左补0）
        data.putValue(RequestData.BUSINESS_ID, Busi_Data.BUSI_VOID_BANK);//撤销银行卡支付
        data.putValue(RequestData.ORIG_TRACE_NO, etCard);//原始流水号  其实就是原凭证号
//        data.putValue(RequestData.TRANS_CHECK, "001");//交易唯一标识
        /**
         * 备注：1. TransCheck参考格式为YYYYMMDD + hhmmss + 收银小票号（保证每笔交易的TransCheck唯一值即可，最好不要超过20位）
         */

        bundle.putSerializable(RequestData.KEY_ERTRAS, data);//传递数据
        intent.putExtras(bundle);
        startActivityForResult(intent, CANCLE_USDK_REQUEST_CARD);

    }

    //    撤销二维码支付  当天的订单
    private void cancleCodePay() {

        etCode = et_code.getText().toString().trim();

        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.allinpay.usdk", "com.allinpay.usdk.MainActivity"));

        Bundle bundle = new Bundle();
        RequestData data = new RequestData();
        data.putValue(RequestData.AMOUNT, "000000000001");//支付金额 金额（12位，分为单位，不足左补0）
        data.putValue(RequestData.BUSINESS_ID, Busi_Data.BUSI_VOID_QR);//撤销二维码支付
        data.putValue(RequestData.ORIG_TRACE_NO, etCode);//原始流水号 其实就是原交易单号
        bundle.putSerializable(RequestData.KEY_ERTRAS, data);//传递数据
        intent.putExtras(bundle);
        startActivityForResult(intent, CANCLE_USDK_REQUEST_CODE);
    }


    /**
     * 二维码支付
     */
    private void goCodePay() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.allinpay.usdk", "com.allinpay.usdk.MainActivity"));
        Bundle bundle = new Bundle();
        RequestData data = new RequestData();
        data.putValue(RequestData.OPER_NO, "001 操作员号");//操作员号
        data.putValue(RequestData.AMOUNT, "000000000001");//支付金额 金额（12位，分为单位，不足左补0）
        data.putValue(RequestData.BUSINESS_ID, Busi_Data.BUSI_SALE_QR);//支付方式 业务类型
        data.putValue(RequestData.PRINT_APPEND_TEXT, "添加打印的内容");//添加打印的内容
        data.putValue(RequestData.PRINT_APPEND_PAGE, "添加打印的联数");//添加打印的联数


        bundle.putSerializable(RequestData.KEY_ERTRAS, data);//传递数据
        intent.putExtras(bundle);
        startActivityForResult(intent, SEND_USDK_REQUEST_CODE);
    }

    //  银行卡支付
    public void goCardPay() {

        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.allinpay.usdk", "com.allinpay.usdk.MainActivity"));
        Bundle bundle = new Bundle();
        RequestData data = new RequestData();
        data.putValue(RequestData.OPER_NO, "木木");//操作员号
        data.putValue(RequestData.AMOUNT, "000000000001");//支付金额
        data.putValue(RequestData.BUSINESS_ID, Busi_Data.BUSI_SALE_BANK);//支付方式 银行卡支付
        data.putValue(RequestData.TRANS_CHECK, "12121212121212");//支付方式 银行卡支付

        data.putValue(RequestData.PRINT_APPEND_TEXT, "添加打印的内容");//添加打印的内容
        data.putValue(RequestData.PRINT_APPEND_PIC, "");//添加打印的内容

        data.putValue(RequestData.PRINT_APPEND_PAGE, "2");//添加打印的联数

//        data.putValue(RequestData.MEMO,"其他内容");//其他内容

        bundle.putSerializable(RequestData.KEY_ERTRAS, data);//传递数据
        intent.putExtras(bundle);
        startActivityForResult(intent, SEND_USDK_REQUEST_CARD);
    }

    /**
     * 接口回调
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        Bundle extras = data.getExtras();
        switch (requestCode) {
            case SEND_USDK_REQUEST_CARD://银行卡  支付
                if (extras == null) {
                    Log.e(TAG, " 银行卡 No extras provided");
                    return;
                }
                cardPayCallBack(extras, resultCode);
                break;
            case SEND_USDK_REQUEST_CODE://二维码  支付
                if (extras == null) {
                    Log.e(TAG, "二维码 No extras provided");
                    return;
                }
                codePayCallBack(extras, resultCode);
                break;
            case CANCLE_USDK_REQUEST_CARD://银行卡撤销
                if (extras == null) {
                    Log.e(TAG, "onActivityResult: 银行卡撤销");
                    return;
                }
                cancleCardPayCallBack(extras, resultCode);

                break;
            case CANCLE_USDK_REQUEST_CODE: //二维码撤销
                if (extras == null) {
                    Log.e(TAG, "onActivityResult: 二维码撤销");
                    return;
                }
                cancleCodePayCallBack(extras, resultCode);
                break;
            case QUERY_BALANCE_USDK_REQUEST://余额查询
                if (extras == null) {
                    Log.e(TAG, "onActivityResult: 余额查询");
                    return;
                }
                queryBalanceCallBack(extras, resultCode);
                break;
            case PRINT_CUSTOM_TEXT:
                if (extras == null) {
                    Log.e(TAG, "onActivityResult:打印自定义文字");
                    return;
                }
                printTextCallBack(extras, resultCode);
            default:
                break;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }


    //余额查询回调
    private void queryBalanceCallBack(Bundle extras, int resultCode) {
        ResponseData respone = (ResponseData) extras.getSerializable(ResponseData.KEY_ERTRAS);
//             BaseData. REJCODE_CN	String	返回码解释
        Log.d(TAG, "查询 交易结果：" + respone.getValue(BaseData.REJCODE_CN));
//             BaseData. REJCODE	String	返回码
        Log.d(TAG, "查询 交易成功返回 00：" + respone.getValue(BaseData.REJCODE));//交易成功 == "00"
    }

    //    二维码支付取消
    private void cancleCodePayCallBack(Bundle extras, int resultCode) {
        ResponseData respone = (ResponseData) extras.getSerializable(ResponseData.KEY_ERTRAS);
//             BaseData. REJCODE_CN	String	返回码解释
        Log.d(TAG, "二维码 交易结果：" + respone.getValue(BaseData.REJCODE_CN));
//             BaseData. REJCODE	String	返回码
        Log.d(TAG, "二维码 交易成功返回 00：" + respone.getValue(BaseData.REJCODE));//交易成功 == "00"
    }

    //   银行卡支付取消
    private void cancleCardPayCallBack(Bundle extras, int resultCode) {
        ResponseData respone = (ResponseData) extras.getSerializable(ResponseData.KEY_ERTRAS);
//             BaseData. REJCODE_CN	String	返回码解释
        Log.d(TAG, "二维码 交易结果：" + respone.getValue(BaseData.REJCODE_CN));
//             BaseData. REJCODE	String	返回码
        Log.d(TAG, "二维码 交易成功返回 00：" + respone.getValue(BaseData.REJCODE));//交易成功 == "00"
    }

    //二维码支付
    private void codePayCallBack(Bundle extras, int resultCode) {
        ResponseData respone = (ResponseData) extras.getSerializable(ResponseData.KEY_ERTRAS);
//             BaseData. REJCODE_CN	String	返回码解释
        Log.d(TAG, "二维码 交易结果：" + respone.getValue(BaseData.REJCODE_CN));
//             BaseData. REJCODE	String	返回码
        Log.d(TAG, "二维码 交易成功返回 00：" + respone.getValue(BaseData.REJCODE));//交易成功 == "00"
//             * BaseData. TIPS	String	小费
//        Log.i(TAG, "二维码 小费" + respone.getValue(BaseData.TIPS));
//             BaseData. TOTAL	String	总计
//        Log.i(TAG, "二维码 总计" + respone.getValue(BaseData.TOTAL));
//             BaseData. AMOUNT	String	金额
//        Log.i(TAG, "二维码 金额" + respone.getValue(BaseData.AMOUNT));
//             BaseData. TRACE_NO	String	流水号
//        Log.i(TAG, "二维码 流水号" + respone.getValue(BaseData.TRACE_NO));
//             BaseData. ORIG_TRACE_NO	String	原始流水号
//        Log.i(TAG, "二维码 总计" + respone.getValue(BaseData.TOTAL));
//             BaseData. EXP_DATE	String	有效期
//        Log.i(TAG, "二维码 有效期" + respone.getValue(BaseData.EXP_DATE));
//             BaseData. BATCH_NO	String	批次号
//        Log.i(TAG, "二维码 批次号" + respone.getValue(BaseData.BATCH_NO));
//             BaseData. MERCH_ID	String	商户号
//        Log.i(TAG, "二维码 商户号" + respone.getValue(BaseData.MERCH_ID));
//             BaseData. MERCH_NAME	String	商户名
//        Log.i(TAG, "二维码 商户名" + respone.getValue(BaseData.MERCH_NAME));
//             BaseData. TER_ID	String	终端号
//        Log.i(TAG, "二维码 终端号" + respone.getValue(BaseData.TER_ID));
//             BaseData. REF_NO	String	系统参考号
//        Log.i(TAG, "二维码 系统参考号" + respone.getValue(BaseData.REF_NO));
//             BaseData. AUTH_NO	String	授权码
//        Log.i(TAG, "二维码 授权码" + respone.getValue(BaseData.AUTH_NO));
//             BaseData. ISS_NO	String	发/卡行号
//        Log.i(TAG, "二维码 发卡行号" + respone.getValue(BaseData.ISS_NO));
//             BaseData. ISS_NAME	String	发卡行名称
//        Log.i(TAG, "二维码 发卡行名称" + respone.getValue(BaseData.ISS_NAME));
//             BaseData.CUPS	String	卡组织或钱包机构
//        Log.i(TAG, "二维码 卡组织或钱包机构" + respone.getValue(BaseData.CUPS));
//             BaseData. CARDNO	String	卡号
//        Log.i(TAG, "二维码 卡号" + respone.getValue(BaseData.CARDNO));
//             BaseData. DATE	String	交易日期
//        Log.i(TAG, "二维码 交易日期" + respone.getValue(BaseData.DATE));
//             BaseData. TIME	String	交易时间
//        Log.i(TAG, "二维码 交易时间" + respone.getValue(BaseData.TIME));
//             BaseData. CARDBACK	String	卡片回收标志
//        Log.i(TAG, "二维码 卡片回收标志" + respone.getValue(BaseData.CARDBACK));
//             BaseData. MEMO	String	备注
//        Log.i(TAG, "二维码 备注" + respone.getValue(BaseData.MEMO));
//             BaseData. TRANS_CHECK	String	交易唯一标识
//        Log.i(TAG, "二维码 交易唯一标识" + respone.getValue(BaseData.TRANS_CHECK));
//             BaseData. OFFLINE_FLAG	String	脱机标识：0-联机、1-脱机
//        Log.i(TAG, "二维码 脱机标识：0-联机、1-脱机" + respone.getValue(BaseData.OFFLINE_FLAG));
//             备注：1. 如果对应Key没有Value，函数则返回空字符串“”

        Log.d(TAG, "二维码 调用返回：" + resultCode);

    }

    /**
     * 二维码支付回调
     *
     * @param extras
     * @param resultCode
     */
    private void cardPayCallBack(Bundle extras, int resultCode) {
        ResponseData respone = (ResponseData) extras.getSerializable(ResponseData.KEY_ERTRAS);
        Log.d(TAG, "银行卡 交易结果：" + respone.getValue(BaseData.REJCODE_CN));
        Log.d(TAG, "银行卡 调用返回：" + resultCode);

    }
}

